package ae.pcfc.cldos.online.common.facade;

import java.util.Date;
import java.util.List;

import ae.pcfc.cldos.online.common.clddb.domain.FnpServiceMaster;
import ae.pcfc.cldos.online.common.etksdb.domain.Client;
import ae.pcfc.cldos.online.common.etksdb.domain.User;
import ae.pcfc.cldos.online.common.exception.BadAppException;
import ae.pcfc.cldos.online.common.exception.GSAppException;
import ae.pcfc.cldos.online.common.exception.NoSuchCompanyException;
import ae.pcfc.cldos.online.common.tscdb.domain.TTscClientCompany;
import ae.pcfc.cldos.online.common.vo.FnpDefaultParamsVO;
import ae.pcfc.cldos.online.common.vo.FnpParamMapperVO;
import ae.pcfc.cldos.online.common.vo.ep.peyment.PaymentAdviceRequestVO;
import ae.pcfc.cldos.online.common.vo.ep.peyment.PaymentAdviceResponseVO;
import ae.pcfc.cldos.online.fnp.exception.FNPException;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPAccountTypeVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPCatalogVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPParameterVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPPaymentAdviceReqVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPPaymentAdviceRspnsVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPPrepaidTransactionVO;
import ae.pcfc.cldos.online.gs.service.client.vo.GSFinancialDataVO;


/**
 * 
 * @author akhader
 *
 */
public interface FnpGSFacade extends Facade {
	/**
	 * @param clientId
	 * @return
	 */
	public Client getClientById(Long clientId);
	/**
	 * @param userName
	 * @return
	 */
	public User findUserByUserName(String userName);
	/**
	 * @param trakheesId
	 * @return
	 */
	public TTscClientCompany getCompanyByTrakheesId(String trakheesId);
	/**
	 * @return List<FNPCatalogVO>
	 * @
	 * @{@link Parameter} List<String> fnpServiceCodeList
	 */
	public List<FNPCatalogVO> retreiveFNPCatalog(List<String> fnpServiceCodeList) ;
	/**
	 * @param List<String> serviceIdList
	 * @return List<FNPParameterVO>
	 * @
	 */
	public List<FNPParameterVO> retreiveFNPParameters(List<String> serviceIdList) ;
	/**
	 * @param fnpPaymentAdviceReqVO
	 * @return FNPPaymentAdviceRspnsVO
	 * @
	 */
	public FNPPaymentAdviceRspnsVO generatePaymentAdvice(FNPPaymentAdviceReqVO fnpPaymentAdviceReqVO);
	/**
	 * @param clentId
	 * @return FNPAccountTypeVO
	 * @
	 */
	public FNPAccountTypeVO enquireDeposits(String clentId);
	/**
	 * @param clientLicenseNumber
	 * @return GSFinancialDataVO
	 */
	public GSFinancialDataVO retreiveFinancialData(String clientLicenseNumber);
	/**
	 * @param serviceCode
	 * @return List<FnpServiceMaster>
	 */
	public List<FnpServiceMaster> getFnpCodeByServiceCode(String serviceCode);
	/**
	 * @param appId
	 * @param userName
	 * @param visaService
	 * @return
	 */

//	public FNPPaymentAdviceRspnsVO generatePayment(String appId, String userName, String visaService,List<FNPParameterVO> fnpParams);

	/**
	 * @param appId
	 * @param userName
	 * @param visaService
	 * @return
	 */
	public FNPPaymentAdviceRspnsVO previewPaymentAdvice(String userName, String visaService,List<FNPParameterVO> fnpParams);
	
	/**
	 * @param paymentAdviceRequestVO
	 * @return
	 * @throws BadAppException
	 */
	public PaymentAdviceResponseVO previewPaymentInformation(
			PaymentAdviceRequestVO paymentAdviceRequestVO) throws BadAppException,NoSuchCompanyException,GSAppException,FNPException;
	
	/**
	 * @param localServiceCode
	 * @return
	 */
	public List<FNPCatalogVO> getFnpCatalogVOsByServiceCode(String localServiceCode);
	/**
	 * @param fnpCatalogs
	 * @param serviceCode
	 */
	public void insertAll(List<FNPCatalogVO> fnpCatalogs, String serviceCode);
	/**
	 * @return
	 */
	public  List<FnpDefaultParamsVO> getDefaultParams();

	/**
	 * @param fnpParamMappers
	 * @param serviceIds
	 */
	public void saveParamMapping(List<FnpParamMapperVO> fnpParamMappers, List<String> serviceIds);
	/**
	 * @param serviceIdList
	 * @return
	 */
	public List<FNPParameterVO> retreiveAllFNPParameters(List<String> serviceIdList);
	/**
	 * @param userName
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public List<FNPPrepaidTransactionVO> enquireDepositTransaction(String userName, Date startDate, Date endDate) ;
}
